package main

import (
	"fmt"
)

func main() {
	// /* 定义局部变量 */
	// var a int = 10
	// /* 使用 if 语句判断布尔表达式 */
	// if a < 20 {
	// 	/* 如果条件为 true 则执行以下语句 */
	// 	fmt.Printf("a 小于 20\n")
	// }
	// fmt.Printf("a 的值为 : %d\n", a)

	// /* 定义局部变量 */
	// var grade string = "B"
	// var marks int = 90

	// switch marks {
	// case 90:
	// 	grade = "A"
	// case 80:
	// 	grade = "B"
	// case 50, 60, 70:
	// 	grade = "C"
	// default:
	// 	grade = "D"
	// }

	// switch {
	// case grade == "A":
	// 	fmt.Printf("优秀!\n")
	// case grade == "B", grade == "C":
	// 	fmt.Printf("良好\n")
	// case grade == "D":
	// 	fmt.Printf("及格\n")
	// case grade == "F":
	// 	fmt.Printf("不及格\n")
	// default:
	// 	fmt.Printf("差\n")
	// }
	// fmt.Printf("你的等级是 %s\n", grade)

	// s := "abc"

	// for i, n := 0, len(s); i < n; i++ { // 常见的 for 循环，支持初始化语句。
	// 	println(s[i])
	// }

	// n := len(s)
	// for n > 0 { // 替代 while (n > 0) {}
	// 	println(s[n]) // 替代 for (; n > 0;) {}
	// 	n--
	// }

	// for { // 替代 while (true) {}
	// 	println(s) // 替代 for (;;) {}
	// }

	// s := "abcd"

	// for i, n := 0, len(s); i < n; i++ { // 避免多次调用 length 函数。
	// 	fmt.Println(i, s[i], n)
	// }

	// m := make(map[string]student)
	// stus := []student{
	// 	{name: "pprof.cn", age: 18},
	// 	{name: "测试", age: 23},
	// 	{name: "博客", age: 28},
	// }

	// fmt.Println("stus type: %s", reflect.TypeOf(stus).Kind().String())

	// for _, stu := range stus {
	// 	m[stu.name] = stu
	// }
	// for k, v := range m {
	// 	fmt.Println(k, "=>", v.name)
	// }

	// s := []int{1, 2, 3, 4, 5}

	// for i, v := range s { // 复制 struct slice { pointer, len, cap }。

	// 	if i == 0 {
	// 		s = s[1:4] // 对 slice 的修改，不会影响 range。
	// 		s[2] = 100 // 对底层数据的修改。
	// 	}

	// 	println(i, v)
	// }

	// stus := []student{
	// 	{name: "pprof.cn", age: 18},
	// 	{name: "测试", age: 23},
	// 	{name: "博客", age: 28},
	// }

	// // fmt.Println(&stus[2].name)
	// // fmt.Println("stus type: %s", reflect.TypeOf(stus).Kind().String())

	// for i, v := range stus {
	// 	v.name = "test" + strconv.Itoa(i)
	// 	fmt.Println(i, v.name)
	// }

	a := [3]int{0, 1, 2}

	for i, v := range a { // index、value 都是从复制品中取出。

		if i == 0 { // 在修改前，我们先修改原数组。
			a[1], a[2] = 999, 999
			fmt.Println(a) // 确认修改有效，输出 [0, 999, 999]。
		}

		a[i] = v + 100 // 使用复制品中取出的 value 修改原数组。

	}

	fmt.Println(a) // 输出 [100, 101, 102]。

}

type student struct {
	name string
	age  int
}
